#include "http_elements.h"

#define set_request(r, i1, i2, i3)	r->method=i1; r->uri=i2; r->version=i3
#define set_response(r, i1, i2)		r->version=i1; r->code=i2; r->reason=i2

//funzioni di testing
void printf_request(http_req *r) {
	printf("[method:%s.uri:%s.version:%d]", http_rqst_method_string[r->method], network_rqst_method_string[r->uri], r->version);
	char *h; int i;
	for(i=0; i<http_rqst_header_len; i++) {
		if(strlen(r->headers[i])>0)
			printf("[H:%s:'%s']", http_rqst_header_string[i], get_header(r->headers, i));
	}
	printf("[data length:%d]", r->data_len);
	printf("\n");
}

void printf_response(http_resp *r) {
	printf("[version:%d.code:%s.reason:%s]", r->version, http_rspn_code_string[r->code], http_rspn_reason_string[r->reason]);
	char *h; int i;
	for(i=0; i<http_rspn_header_len; i++) {
		if(strlen(r->headers[i])>0)
			printf("[H:%s:'%s']", http_rspn_header_string[i], get_header(r->headers, i));
	}
	printf("[data length:%d]", r->data_len);
	printf("\n");
}

//identifica la lunghezza del content specificata nell'header http
int find_content_len(char hs[HTTP_MAX_HEADERS][HTTP_HEADER_LEN], int msg_type) {
	int type = -1;
	switch (msg_type) {
		case HTTP_MSG_TYPE_RQST:
			type = HTTP_RQST_HEAD_CONT_LEN;
		case HTTP_MSG_TYPE_RSPN:
			type = HTTP_RSPN_HEAD_CONT_LEN;
	}
	return atoi(get_header(hs, type));
}

//registra il valore intero 'value' nell'header di tipo 'type'
void set_header_int(char hs[HTTP_MAX_HEADERS][HTTP_HEADER_LEN], int type, int value) {
	itoa(value, hs[type]);
}

//registra la stringa 'string' nell'header di tipo 'type'
void set_header(char hs[HTTP_MAX_HEADERS][HTTP_HEADER_LEN], int type, char *string) {
	memcpy(hs[type], string, strlen(string)+1);
	hs[type][strlen(string)]='\0';
}

//registra 'len' caratteri della stringa 'string' nell'header di tipo type
void set_header_len(char hs[HTTP_MAX_HEADERS][HTTP_HEADER_LEN], int type, char *string, int len) {
	memcpy(hs[type], string, len);
	hs[type][len]='\0';
}

//inizializza i valori della request line di un pacchetto http
void set_http_reqline(http_req *r,int m,int u,int v) {
	r->method = m;
	r->uri = u;
	r->version = v;
}

//inizializza i valori della status line di un pacchetto http
void set_http_respline(http_resp *r,int v,int c, int reas) {
	r->code = c;
	r->reason = reas;
	r->version = v;
}

//copia tutti gli header http da un pacchetto ad un altro
void copy_http_headers(char dest[HTTP_MAX_HEADERS][HTTP_HEADER_LEN], char source[HTTP_MAX_HEADERS][HTTP_HEADER_LEN]) {
	int i;
	for(i=0; i<HTTP_MAX_HEADERS;i++)
		set_header(dest, i, get_header(source, i));
}

//pulisce gli header di un pacchetto http (li setta a stringa vuota)
void clean_headers(char hs[HTTP_MAX_HEADERS][HTTP_HEADER_LEN], int len) {
	char *cursor, *end;
	for(cursor=hs[0], end=hs[len-1]; cursor!=end; cursor++) {
		cursor[0]='\0';
	}
}

//pulisce gli header di una cache http
void clean_all_headers(http_messages *mes) {
	clean_headers(mes->req.headers, http_rqst_header_len);
	clean_headers(mes->resp.headers, http_rspn_header_len);
}
